package algorithm.t202110;

import org.junit.Test;

/**
 * @author : 李红磊
 * @version :1.0
 * @date : 2021/10/11 16:45
 * @description : 算法
 */
public class t20211011 {

    /*
    704.二分查找
     给定一个 n 个元素有序的（升序）整型数组 nums 和一个目标值 target  ，
     写一个函数搜索 nums 中的 target，如果目标值存在返回下标，否则返回 -1。*/

    public int search1(int[] nums, int target) {
        if (nums == null) {
            return -1;
        }


        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            int mid = left + right >>> 1;
            if (nums[mid] == target) {
                return mid;
            } else if (target > nums[mid]) {
                left = mid + 1;
                continue;
            } else {
                right = mid - 1;
            }

        }
        return -1;
    }

    static boolean isBadVersion(int version) {
        return true;
    }

    /*
    278.第一个错误版本
    你是产品经理，目前正在带领一个团队开发新的产品。不幸的是，你的产品的最新版本没有通过质量检测。
    由于每个版本都是基于之前的版本开发的，所以错误的版本之后的所有版本都是错的。

    假设你有 n 个版本 [1, 2, ..., n]，你想找出导致之后所有版本出错的第一个错误的版本。

    你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。
    实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

     */

   static public int firstBadVersion(int n) {
        if (n == 0 || n == 1) {
            return 1;
        }

        int l=0,r=n-1;

        while (l<r){

            int mid=l+r>>>1;

            if(isBadVersion(mid+1)){
                r=mid;
            } else {
                l=mid+1;
            }



        }


        return r+1;

    }



    public void test(){
        int[] arr = new int[5];
        int num = 1;
        for (int i = 0; i < arr.length; i++) {
            arr[i] = num++;
        }

        for (int ele : arr) {
            System.out.println(ele);
        }

    }


    public static void main(String[] args) {
        int version = firstBadVersion(5);
        System.out.println(version);
    }

}
